cat run_dcgm_exporter.sh  
#!/bin/bash

# 定义一个函数，用于放通指定端口
allow_port() {
    local port=$1  # 获取传入的端口号

    # 检查iptables中是否已经存在该端口的放通策略
    if ! iptables -C INPUT -p tcp --dport "$port" -j ACCEPT &> /dev/null; then
        echo "当前系统未放通端口 $port，正在放通..."
        iptables -I INPUT -p tcp --dport "$port" -j ACCEPT
        echo "端口 $port 已成功放通。"
    else
        echo "端口 $port 已经放通，无需重复操作。"
    fi
}

# 检查镜像文件是否存在
if [ ! -f "dcgm-exporter_3.3.8-3.6.0-ubuntu22.04-koo2.tar" ]; then
    echo "错误：镜像文件 dcgm-exporter_3.3.8-3.6.0-ubuntu22.04-koo2.tar 不存在，请检查文件路径。"
    exit 1
fi

# 调用函数放通指定端口
allow_port 9400

# 导入容器镜像
echo "正在导入容器镜像..."
nerdctl -n k8s.io load -i dcgm-exporter_3.3.8-3.6.0-ubuntu22.04-koo2.tar

# 检查镜像是否导入成功
echo "确认镜像是否导入成功："
if ! nerdctl -n k8s.io images | grep -q "dcgm-exporter"; then
    echo "错误：镜像导入失败，请检查镜像文件是否正确。"
    exit 1
fi

# 运行容器
echo "正在运行容器..."
nerdctl -n k8s.io run -d \
  --net=host \
  --gpus all \
  --cap-add=SYS_ADMIN \
  --cap-add=NET_ADMIN \
  --device=/dev/nvidiactl \
  --device=/dev/nvidia-uvm \
  registry.ai.sangfor.com/nvidia/k8s/dcgm-exporter:3.3.8-3.6.0-ubuntu22.04-koo2 \
  --switch-devices g

sleep 5
# 检查容器是否运行成功
echo "确认容器是否运行成功："
if ! nerdctl -n k8s.io ps | grep -q "dcgm-exporter"; then
    echo "错误：容器运行失败，请检查容器配置。"
    exit 1
fi

sleep 10
# 确认容器是否拿到监控数据
echo "确认容器是否拿到监控数据："
curl -s 127.0.0.1:9400/metrics > /tmp/metrics_result.txt &
wait $!  # 等待后台进程完成
if [ $? -ne 0 ]; then
    echo "错误：无法从容器获取监控数据，请检查容器状态。"
    exit 1
fi

# 检查结果文件是否包含有效信息
if grep -q "DCGM_FI_DEV_VGPU_LICENSE_STATUS" /tmp/metrics_result.txt; then
    echo "监控数据获取成功，结果已保存到 /tmp/metrics_result.txt 文件中。"
else
    echo "错误：获取的监控数据无效，请检查容器状态。"
    exit 1
fi

echo "所有步骤执行成功，dcgm-exporter 已经正常运行并暴露端口 9400。"

